package cn.xshi.sys.init.task;

import cn.xshi.sys.model.SysIpFrozen;
import cn.xshi.common.cache.redis.RedisUtil;
import cn.xshi.common.constant.CacheConstant;
import cn.xshi.common.util.CollectionUtil;
import cn.xshi.common.util.JsonUtil;
import cn.xshi.common.util.SpringUtils;

import java.util.*;
import java.util.concurrent.RecursiveTask;

/**
 * 多任务分解
 */
public class InitTask extends RecursiveTask<Integer> {


    private List<SysIpFrozen> sysIpFrozenList;

    public int groupNumber;

    public InitTask(List<SysIpFrozen> sysIpFrozenList, int groupNumber){
        this.sysIpFrozenList = sysIpFrozenList;
        this.groupNumber = groupNumber;
    }

    @Override
    protected Integer compute() {
        int result=0;
        if(sysIpFrozenList.size()<=groupNumber){
            //一个任务即可
            result+=doCallable(sysIpFrozenList);
        }else{
            //拆分任务
            List<InitTask> subTaskList =createSubTasks(sysIpFrozenList);
//            //方法一 采用fork（注意：该效率不是太高）
//            for(FasErrorTask subTask :subTaskList){
//                subTask.fork();//子任务计划执行
//            }

            //方法二 采用invokeAll（注意：该效率高一些）
            invokeAll(subTaskList);

            //合并执行结果
            for(InitTask subTask :subTaskList){
                result+=subTask.join();
            }
        }
        return result;
    }

    private Integer doCallable(List<SysIpFrozen> sysIpFrozenList){
        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
        Integer result=0;
        for(SysIpFrozen sysIpFrozen : sysIpFrozenList){
            Boolean flag = redisUtil.hset(CacheConstant.SYSHASH,CacheConstant.SysIpFrozenCACHE+":"+ sysIpFrozen.getAddress(), JsonUtil.toFastJson(sysIpFrozen));
            if(flag){
                result++;
            }
        }
       return result;
    }

    private List<InitTask> createSubTasks(List<SysIpFrozen> sysIpFrozenList) {
        List<InitTask> subTasks = new ArrayList<InitTask>();
        LinkedHashMap map = CollectionUtil.groupList(sysIpFrozenList,groupNumber);
        Iterator iter = map.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            InitTask initTask = new InitTask((List<SysIpFrozen>)entry.getValue(),groupNumber);
            subTasks.add(initTask);
        }
        return subTasks;
    }
}
